package modelo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.TreeMap;

public class IngredienteDAO {
	private TreeMap<Integer, Ingrediente> elementos = new TreeMap<Integer, Ingrediente>();

	public IngredienteDAO() {
		super();
	}
	
	public void cargar() {
		ArrayList<Ingrediente> arr = Datos.getInstancia().leerBaseDatos("ingrediente", new CreadorDato<Ingrediente>() {
			@Override
			public Ingrediente crear(ResultSet rs) throws SQLException {
				return new Ingrediente(rs.getInt("codigo"), rs.getString("nombre"), rs.getDouble("cantidad"));
			}
		});
		
		for (Ingrediente ing : arr)
			elementos.put(ing.getCodigo(), ing);
	}

	public Ingrediente anadir(String nombre) {
		try {
			ResultSet rs = Conexion.consultar("INSERT INTO ingrediente (nombre, cantidad) VALUES ('" + nombre + "', 0) RETURNING codigo;");
			if (rs.next()) {
				Ingrediente ing = new Ingrediente(rs.getInt("codigo"), nombre, 0);
				elementos.put(ing.getCodigo(), ing);
				return ing;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public void actualizar(Ingrediente ing) {
		String cadena = "UPDATE ingrediente SET nombre = '" + ing.getNombre() + "', cantidad = " + ing.getCantidad() + " WHERE codigo = " + ing.getCodigo();
		Conexion.ejecutar(cadena);
	}
	
	public void eliminar(int codigo) {
		String cadena = "DELETE FROM ingrediente WHERE codigo = " + codigo;
		Conexion.ejecutar(cadena);
		elementos.remove(codigo);
	}
	
	public Ingrediente buscar(int codigo) {
		return elementos.get(codigo);
	}
	
	public ArrayList<Ingrediente> ingredientesGeneral() {
		return adjuntarObjeto(Conexion.consultar("SELECT codigo FROM ingrediente"));
	}
	
	public ArrayList<Ingrediente> ingredientesPorProducto(int producto) {
		return adjuntarObjeto(Conexion.consultar("SELECT ingrediente AS codigo FROM detalle_producto WHERE producto = " + producto));
	}
	
	private ArrayList<Ingrediente> adjuntarObjeto(ResultSet rs) {
		ArrayList<Ingrediente> lst = new ArrayList<Ingrediente>();
		
		try {
			while (rs.next()) lst.add(elementos.get(rs.getInt("codigo")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
